import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Random;
import java.util.Scanner;


public class Sorts {

	public static void main(String[] args) {
		//atributos
        int[] datos = new int[10];
        Random random = new Random();
        
        //variables
        int opcion;
        int num;
        
        do{
            menu();
            opcion = pedirNumero("Ingrese la opcion");
            switch (opcion){
                case 1: // generar lista con numeros enteros al azar
                	do{
                		num = pedirNumero("Ingrese cantidad de datos a ordenar");
                	} while (num < 1);
                	datos = new int[num];
                	for (int i = 0; i < num; i++)
                		datos[i] = random.nextInt(100);
                	desplegarDatos(datos);
                    break;
                case 2: // generar un arreglo con numeros ordenados
                	do{
                		num = pedirNumero("Ingrese cantidad de datos a ordenar");
                	} while (num < 1);
                	datos = new int[num];
                	for (int i = 0; i< num; i++)
                		datos[i]=i*2;
                	desplegarDatos(datos);
                	break;
                case 3: // ordena una lista por medio de InsertionSort
                	insertionSort(datos, datos.length);
                    break;
                case 4: // ordena una lisata por medio de QuickSort   
                    break;
                case 5: // salir del programa
                	System.out.println("\n .: Feliz dia :. \n");
                    break;
                default: // no selecciono ninguna opcion
                    break;
            } 
        }while (opcion != 5);
	}
	
	//menu: muestra en pantalla el menu principal para el usuario
    //no posee parametros y no devuelve ningun valor
    public static void menu(){
        System.out.println();
        System.out.println("+-------   MENU   -------------------+");
        System.out.println("| 1. Generar datos al azar           |");
        System.out.println("| 2. Generar datos ordenados         |");
        System.out.println("| 3. Ordenar con InsertionSort       |");
        System.out.println("| 4. Ordenar con QuickSort           |");
        System.out.println("| 5. Salir del programa              |");
        System.out.println("+------------------------------------+");
    }
    
    //desplegarDatos: despliega el conjunto de numeros
    public static void desplegarDatos(int[] data){
        for (int i = 0; i < data.length; i++)
        	System.out.print(data[i]+" ");
    }
    
    //pedirOpcion: pide el numero de la opcion ya validado
    //parametro tipo String que es la pregunta previa a que el usuario introduzca el numero
    //devuelve el entero con el valor
    public static int pedirNumero(String texto){
        Scanner readln = new Scanner(System.in);
        int numero = 0;
        try{
                System.out.println(texto);
                numero = readln.nextInt();
        }
        catch(InputMismatchException exception){
                System.out.println("\n ERROR --> NUMERO NO VALIDO \n");
        }
        readln.nextLine();
        return numero;
    }
    
    //insertionSort: ordena elementos colocando hasta el frente los numeros ya ordenados
    //	pre: 0 <= n <= data.length
    //	post: valores en datos[0..n-1] estan en orden acendente
    public static void insertionSort(int data[], int n){
    	int numSorted = 1;
    	int index;
    	while (numSorted < n){
    		//obtiene el primer valor no ordenado
    		int temp = data[numSorted];
    		// ... inserta dentro de los valores insertados
    		for (index = numSorted; index > 0; index--){
    			if (temp < data[index-1])
    				data[index] = data[index-1];
    			else
    				break;
    		}
    		// vuelve a ingresar el valor
    		data[index] = temp;
    		numSorted++;
    	}
    	
    	System.out.println("\n Los datos han sido ordenados:");
    	desplegarDatos(data);
    }
}
